package GestionDatosFM;

import java.util.ArrayList;

import javax.swing.JFrame;

import ExcepcionesFM.ExcepcionFiguraEnPuntuacion;
import ExcepcionesFM.ExcepcionPuntuacionInvalida;
import LogicaFM.EquipoFantasia;
import LogicaFM.EquipoPrimera;
import LogicaFM.Fecha;
import LogicaFM.Formacion;
import LogicaFM.JugadorPrimera;
import LogicaFM.Puntuacion;

public class GestorPuntuacion {

	public static void crearPuntuacion(JugadorPrimera jugador, boolean jugoMasDe20, boolean fueFigura, int calificacion, int golesConvertidos, 
			int golesEnContra, int golesRecibidos, int penalesConvertidos, int penalesErrados, int penalesAtajados, boolean tarjetaAmarilla, boolean tarjetaRoja) {
		
		Puntuacion nuevaPuntuacion = new Puntuacion(GestorFecha.getFechaActual());
		
		nuevaPuntuacion.setJugoMasVeinte(jugoMasDe20);
		nuevaPuntuacion.setFueFigura(fueFigura);
		nuevaPuntuacion.setPuntajeGeneral(calificacion);
		nuevaPuntuacion.setGolesConvertidos(golesConvertidos);
		nuevaPuntuacion.setGolesEnContra(golesEnContra);
		nuevaPuntuacion.setGolesRecibidos(golesRecibidos);
		nuevaPuntuacion.setPenalesConvertidos(penalesConvertidos);
		nuevaPuntuacion.setPenalesErrados(penalesErrados);
		nuevaPuntuacion.setPenalesAtajados(penalesAtajados);
		nuevaPuntuacion.setAmarilla(tarjetaAmarilla);
		nuevaPuntuacion.setRoja(tarjetaRoja);
		
		jugador.setPuntuacion(nuevaPuntuacion);
		
		
	}

	public static void validarPuntuacionEquipo(ArrayList<JugadorPrimera> listaJugadores, Fecha fechaAValidar, int condicionEquipo) throws ExcepcionPuntuacionInvalida{
		
		ArrayList<JugadorPrimera> listaFiguras = new ArrayList<JugadorPrimera>();
		
		for(int i=0; i<listaJugadores.size(); i++){
			
			
			if(listaJugadores.get(i).getPuntuacion(fechaAValidar.getNumeroFecha())!= null && listaJugadores.get(i).getPuntuacion(fechaAValidar.getNumeroFecha()).fueFigura())
				listaFiguras.add(listaJugadores.get(i));
				
		}
		
		if(listaFiguras.size()==0)
			throw new ExcepcionPuntuacionInvalida("No ha marcado ningun Jugador como Figura del Partido.");
		
		if(listaFiguras.size()>1)
			throw new ExcepcionFiguraEnPuntuacion("Ha marcado mas de un Jugador como Figura del Partido. Cual desea elegir?", listaFiguras, condicionEquipo);
		
	}

	public static void calcularPuntuaciones(int numeroFecha) {
		
		int i, j, indice;
		JugadorPrimera arrayJugadores[] = JugadorDAO.selectJugadores();
		EquipoFantasia arrayEquiposFantasia[] = GestorEquipoFantasia.getEquipos(numeroFecha);
		ArrayList<JugadorPrimera> titulares, suplentes;
		
		for(i = 0; i<arrayJugadores.length; i++){
			
			arrayJugadores[i].setPuntuacion(PuntajesDAO.selectPuntajes(numeroFecha, arrayJugadores[i]));
			
		}
		
		for(i = 0; i<arrayEquiposFantasia.length; i++){
			
			titulares = arrayEquiposFantasia[i].getFormacion(GestorFecha.getFechaActual()).getTitulares();
			suplentes = arrayEquiposFantasia[i].getFormacion(GestorFecha.getFechaActual()).getSuplentes();
			
			for(j = 0; j<titulares.size(); j++){
				
				indice = indiceJugador(titulares.get(j), arrayJugadores);
						
				arrayEquiposFantasia[i].getFormacion(GestorFecha.getFechaActual()).sumaPuntuacion(arrayJugadores[indice].getPuntajeTotal(numeroFecha));
				
								
			}
			
			for(j = 0; j<suplentes.size(); j++){
				
				if(arrayEquiposFantasia[i].getFormacion(GestorFecha.getFechaActual()).noSumaTitular(suplentes.get(j).getPuesto())){
					
					indice = indiceJugador(suplentes.get(j), arrayJugadores);
					arrayEquiposFantasia[i].getFormacion(GestorFecha.getFechaActual()).sumaPuntuacion(arrayJugadores[indice].getPuntajeTotal(numeroFecha));
				}
				
			}

			GestorFormacionEquipoFantasia.setPuntaje(numeroFecha, arrayEquiposFantasia[i]);
			
		}
		return;
	}

	public static Puntuacion getPuntuacion(JugadorPrimera jugador, Fecha fecha) {

		return PuntajesDAO.selectPuntajes(fecha.getNumeroFecha(), jugador);
	}

	public static void guardarPuntuaciones(EquipoPrimera equipoLocal, EquipoPrimera equipoVisitante) {
		// TODO Auto-generated method stub
		//USA GestorFecha.getFechaActual() para sacar el indice de la puntuacion del jugador que tenes q guardar
	}
	
	private static int indiceJugador(JugadorPrimera jugador, JugadorPrimera[] lista) {
		
		int i, indice = 0;
		
		for(i = 0; i<lista.length; i++){
			
			if(lista[i].getNombreApellido().equals(jugador.getNombreApellido()))
				indice = i;
			
		}
		
		return indice;
		
	}
}
